﻿#include "pch.h"
#include "protocol.h"

LPCTSTR ImProtocol::SERVER_IP = _T("192.168.1.112");    // 服务器 IP 地址
LPCTSTR ImProtocol::MULTI_CHAT = _T("群发消息");        // 群发消息标志

/**
 * 协议的构造方法。
 * @param type  协议类型
 */
ImProtocol::ImProtocol(Type type): 
    mType(type) {
}

/**
 * 用户信息的构造方法。
 */
UserInfo::UserInfo() :
    mIconIndex(0) {
    ZeroMemory(mPassword, sizeof(mPassword));
    ZeroMemory(mUsername, sizeof(mUsername));
}

/**
 * 用户信息的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
UserInfo::UserInfo(int iconIndex, LPCTSTR password, LPCTSTR username) :
    mIconIndex(iconIndex) {
    if (password != NULL) {
        _tcscpy_s(mPassword, ImProtocol::PASSWORD_BUF_LEN, password);
    } else {
        ZeroMemory(mPassword, sizeof(mPassword));
    }
    _tcscpy_s(mUsername, ImProtocol::USERNAME_BUF_LEN, username);
}

/**
 * 添加好友请求的构造方法。
 * @param dstUsername   目标用户名
 * @param srcIconIndex  源用户头像索引
 * @param srcUsername   源用户名

 */
AddFriendRequest::AddFriendRequest(LPCTSTR dstUsername, int srcIconIndex, LPCTSTR srcUsername) :
    ImProtocol(ADD_FRIEND_REQUEST),
    mIconIndex(srcIconIndex) {
    _tcscpy_s(mDstUsername, USERNAME_BUF_LEN, dstUsername);
    _tcscpy_s(mSrcUsername, USERNAME_BUF_LEN, srcUsername);
}

/**
 * 添加好友结果的构造方法。
 * @param dstIconIndex  目标用户头像索引
 * @param dstUsername   目标用户名
 * @param resultCode    结果码
 * @param srcUsername   源用户名
 */
AddFriendResult::AddFriendResult(int dstIconIndex, LPCTSTR dstUsername, ResultCode resultCode, LPCTSTR srcUsername) :
    ImProtocol(ADD_FRIEND_RESULT),
    mDstIconIndex(dstIconIndex), 
    mResultCode(resultCode) {
    _tcscpy_s(mDstUsername, USERNAME_BUF_LEN, dstUsername);
    if (srcUsername != NULL) {
        _tcscpy_s(mSrcUsername, USERNAME_BUF_LEN, srcUsername);
    }
}

/**
 * 聊天信息的构造方法。
 * @param content     内容
 * @param dstUsername 目标用户名
 * @param srcUsername 源用户名
 * @param time        发送时间
 */
ChatInfo::ChatInfo(LPCTSTR content, LPCTSTR dstUsername, LPCTSTR srcUsername, LPCTSTR time) :
    ImProtocol(CHAT) {
    _tcscpy_s(mContent, CONTENT_BUF_LEN, content);
    _tcscpy_s(mDstUsername, USERNAME_BUF_LEN, dstUsername);
    _tcscpy_s(mSrcUsername, USERNAME_BUF_LEN, srcUsername);
    _tcscpy_s(mTime, DATE_TIME_BUF_LEN, time);
}

/**
 * 好友登录通知的构造方法。
 * @param username    用户名
 */
FriendLogon::FriendLogon(LPCTSTR username) :
    ImProtocol(FRIEND_LOGON) {
    _tcscpy_s(mUsername, USERNAME_BUF_LEN, username);
}

/**
 * 离线请求的构造方法。
 * @param username    用户名
 */
LogoffRequest::LogoffRequest(LPCTSTR username) :
    ImProtocol(LOGOFF) {
    _tcscpy_s(mUsername, USERNAME_BUF_LEN, username);
}

/**
 * 登录请求的构造方法。
 * @param password  密码
 * @param username  用户名
 */
LogonRequest::LogonRequest(LPCTSTR password, LPCTSTR username) :
    ImProtocol(LOGON),
    mUserInfo(0, password, username) {
}

/**
 * 登录结果的构造方法。
 */
LogonResult::LogonResult() :
    ImProtocol(LOGON),
    mFriendCount(0),
    mIconIndex(-1),
    mResultCode(SUCCEEDED) {
    ZeroMemory(mFriends, sizeof(mFriends));
    ZeroMemory(mFriendsOnline, sizeof(mFriendsOnline));
}

/**
 * 注册请求的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
RegRequest::RegRequest(int iconIndex, LPCTSTR password, LPCTSTR username) :
    ImProtocol(REG),
    mUserInfo(iconIndex, password, username) {
}

/**
 * 注册结果的构造方法。
 */
RegResult::RegResult() :
    ImProtocol(REG),
    mResultCode(SUCCEEDED) {
}
